Ποια είναι η πιο γρήγορη μέθοδος για να μετατρέψεις ένα java.nio.ByteBuffer a σε (πρόσφατα δημιουργημένο) CharBuffer b ή char [] b. Με αυτόν τον τρόπο είναι σημαντικό, ότι ένα [i] == b [i]. Αυτό σημαίνει ότι δεν συνθέτουν ένα [i] και ένα [i + 1] μια τιμή b [j], τι θα έκανε το getChar (i), αλλά οι τιμές πρέπει να είναι "spread" byte a [] = {1,2,3, 125,126,127, -128, -127, -126} // το καθένα byte (τα οποία είναι υπογεγραμμένα) char b [] = {1,2,3, 125,126,127, 128, 129, 130} // το καθένα a char (που δεν έχουν υπογραφεί) Σημειώστε ότι το byte: -128 έχει τα ίδια (χαμηλότερα 8) bit με char: 128. Ως εκ τούτου, υποθέτω ότι η «καλύτερη» ερμηνεία θα ήταν όπως την ανέφερα παραπάνω, επειδή τα bit είναι ίδια. Μετά από αυτό χρειάζομαι επίσης την αντίστροφη μετάφραση: Ο πιο αποτελεσματικός τρόπος για να επαναφέρω ένα char [] ή java.nio.CharBuffer σε ένα java.nio.ByteBuffer.
2021-01-06 08:18:50
Έτσι, αυτό που θέλετε είναι να μετατρέψετε χρησιμοποιώντας την κωδικοποίηση ISO-8859-1. Δεν ισχυρίζομαι τίποτα σχετικά με την αποτελεσματικότητα, αλλά τουλάχιστον είναι πολύ σύντομο να γράψω: Αποτέλεσμα CharBuffer = Charset.forName ("ISO-8859-1"). Αποκωδικοποίηση (byteBuffer); Η άλλη κατεύθυνση θα ήταν: ByteBuffer αποτέλεσμα = Charset.forName ("ISO-8859-1"). Κωδικοποίηση (charBuffer); Παρακαλώ μετρήστε το σε σχέση με άλλες λύσεις. (Για να είμαστε δίκαιοι, το τμήμα Charset.forName δεν πρέπει να συμπεριληφθεί και θα πρέπει επίσης να γίνει μόνο μία φορά, όχι για κάθε buffer ξανά.) Από το Java 7 και μετά υπάρχει επίσης η κλάση StandardCharsets με προκαταρκτικές παρουσίες Charset, ώστε να μπορείτε να χρησιμοποιήσετε Αποτέλεσμα CharBuffer = StandardCharsets.ISO_8859_1.decode (byteBuffer); και ByteBuffer αποτέλεσμα = StandardCharsets.ISO_8859_1.encode (charBuffer); αντι αυτου. (Αυτές οι γραμμές κάνουν το ίδιο με τις προηγούμενες, απλώς η αναζήτηση είναι ευκολότερη και δεν υπάρχει κίνδυνος να πληκτρολογήσετε λάθος τα ονόματα και δεν χρειάζεται να πιάσετε τις αδύνατες εξαιρέσεις.) | Θα συμφωνούσα με το @ Ishtar's, θα πρότεινα να μην μετατραπούν σε νέα δομή και να μετατραπούν μόνο όταν τη χρειάζεστε. Ωστόσο, εάν έχετε έναν σωρό ByteBuffer μπορείτε να το κάνετε. ByteBuffer bb = ... byte [] array = bb.array (); char [] chars = νέο char [bb.remaining ()]; για (int i = 0; i